package com.berchen.同步锁;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 用于解决安全问题的方式：
 * synchronized：隐式锁。
 *  1、同步代码块synchronized。
 *  2、同步方法synchronized。
 *
 *  3、同步锁。：显示锁，需要通过lock方法上锁，通过unlock方法释放锁。
 *
 */
public class TestLock {

    public static void main(String[] args){

        Ticket ticket = new Ticket();

        new Thread(ticket,"1号窗口").start();
        new Thread(ticket,"2号窗口").start();
        new Thread(ticket,"3号窗口").start();
    }
}
class Ticket implements Runnable{

    private int ticket=100; // 100张票

    private Lock lock=new ReentrantLock();

    @Override
    public void run() {

        while(true){

            lock.lock();    // 上锁
            // 多个线程共享数据。
            try {
                if (ticket > 0) {

                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "售出" + ticket-- + "号票");
                } else
                    break;
            }
            finally {
                lock.unlock();  // 释放锁
            }
        }
    }
}